#ifndef CPP11FEATURETEST_LOGER_H
#define CPP11FEATURETEST_LOGER_H

#include <stdio.h>
#include <time.h>
#include <fstream>
#include <iostream>
#include <mutex>
#include <stdio.h>
#include <string.h>
#include <string>


using namespace std;
typedef enum {
    Mode_Daily,  // 每天保存一次日志
    MODE_Monthly,  // 每个月保存一次日志
    MODE_Weekly,   // 每周保存一次日志
    MODE_Size         // 根据已存储的容量来保存日志
}Mode;

typedef enum {
    LEVEL_DEBUG = 0,  //  调试模式所有日志都会显示
    LEVEL_INFO,  //  INFO和WARNING和ERROR
    LEVEL_WARNING,   // WARNING和ERROR
    LEVEL_ERROR         // 仅显示ERROR
}Level;

class Loger {
public:
    Loger(string path,string prefix);
    Loger(string path,string prefix,bool old);
    ~Loger();
    #define FILE_POSITION __FILE__,__LINE__
    void SetMinimalLevel(Level);
    void SetWorkMode(Mode);
    int Debug(string,string file = __FILE__,int line = __LINE__);
    int Info(string,string file = __FILE__,int line = __LINE__);
    int Warning(string,string file = __FILE__,int line = __LINE__);   
    int Error(string,string file = __FILE__,int line = __LINE__);        
    int DumpOBJ(void *dst,int rowNum,int num,bool ifAsii,char *out);

    void operator+(const string&);
    void operator<<(const string&);
private:
    string mPath;
    string mPrefix;
    string mCurrentPath;
    FILE *mFile;            // 日志文件
    Mode mMode;        // 工作模式
    Level  mLevel;        // 最低调试输出
    string mCurrentDate;    // 当天
    bool mValid;
    std::mutex mMux;
};

#endif 
